import java.util.Scanner;
import java.util.Random;

public class Main {

    /**
     判断年份是否为闰年
     */
    public static void leapYear() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入年份：");

        int year = scanner.nextInt();

        // 此处完成代码

        scanner.close();
    }

    /**
     判断成绩是`优秀`、`良好`、`中等`、`及格`、`不及格`
     */
    public static void grade() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入分数：");

        int score = scanner.nextInt();

        // 此处完成代码

        scanner.close();
    }

    /**
     摄氏度、华氏度的转换
     */
    public static void convCF() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入0是摄氏转华氏度，输入1是华氏转摄氏度：");

        int mode = scanner.nextInt();

        // 此处完成代码

        scanner.close();
    }

    /**
     输出九九乘法表
     */
    public static void multiplicationTable() {
        // 此处完成代码
    }

    /**
     求 1 ~ n 的和
     */
    public static void sum1ToN() {
        Scanner scanner = new Scanner(System.in);
        int sum = 0;

        System.out.print("输入n：");

        int n = scanner.nextInt();

        // 使用 for 循环方式，请注释掉 while 循环方式
        // 此处完成代码

        // 使用 while 循环方式，请注释掉 for 循环方式
        // 此处完成代码

        System.out.printf("1 ~ %d之和：%d", n, sum);

        scanner.close();
    }

    /**
     输出 1 ~ n 所有能被 3 整除的数
     */
    public static void divisibleBy3() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入n：");

        int n = scanner.nextInt();

        // 此处完成代码

        scanner.close();
    }

    /**
     输出 100 ~ 999 所有水仙花数
     */
    public static void narcissisticNumber() {
        // 此处完成代码
    }

    /**
     输出 1 ~ n 所有质数
     */
    public static void primeNumber() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入n：");

        int n = scanner.nextInt();

        // 此处完成代码

        scanner.close();
    }

    /**
     猜数字游戏
     */
    public static void numberGuess() {
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();
        int r = random.nextInt(100);
        System.out.println("数字已生成");

        // 此处完成代码

        scanner.close();
    }

    /**
     输出斐波那契数列 - for 循环
     */
    public static void fibonacciFor() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入n：");

        int n = scanner.nextInt();

        // 此处完成代码

        scanner.close();
    }

    /**
     输出斐波那契数列 - 递归
     */
    public static int fibonacciRecursion(int n) {
        // 此处完成代码
        return 0; // 有必要的话这句也要改掉
    }

    /**
     输出斐波那契数列 - 调用递归
     */
    public static void fibonacci() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入n：");

        int n = scanner.nextInt();

        int r = fibonacciRecursion(n);

        System.out.println(r);

        scanner.close();
    }

    /**
     计算阶乘 - for 循环
     */
    public static void factorialFor() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入n：");

        int n = scanner.nextInt();

        int f = 1;

        // 此处完成代码

        System.out.println(f);

        scanner.close();
    }

    /**
     计算阶乘 - 递归
     */
    public static int factorialRecursion(int n) {
        // 此处完成代码
        return 0; // 有必要的话这句也要改掉
    }

    /**
     计算阶乘 - 调用递归
     */
    public static void factorial() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入n：");

        int n = scanner.nextInt();

        int r = factorialRecursion(n);

        System.out.println(r);

        scanner.close();
    }

    /**
     统计字符串中英文字母、数字、空格的数量
     */
    public static void stringStatistic() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入字符串，只包含英文字母、数字、空格：");

        String s = scanner.nextLine();

        int letters = 0;
        int digits = 0;
        int spaces = 0;

        // 此处完成代码

        System.out.printf("字母有%d个\n", letters);
        System.out.printf("数字有%d个\n", digits);
        System.out.printf("空格有%d个", spaces);

        scanner.close();
    }

    /**
     检查一个字符串是否为回文
     */
    public static void palindrome() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入字符串：");

        String s = scanner.nextLine();

        // 此处完成代码

        scanner.close();
    }

    /**
     数组逆序输出
     */
    public static void reverseArray() {
        int[] numbers = randomInitIntArray(30, 0, 10);

        // 此处完成代码

        printArray(numbers);
    }

    /**
     移动 0 至数组末尾
     */
    public static void move0ToEnd() {
        int[] numbers = randomInitIntArray(30, 0, 10);

        // 此处完成代码

        printArray(numbers);
    }

    /**
     数组的轮转
     */
    public static void rotateArray() {
        int[] numbers = randomInitIntArray(30, 0, 10);
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入数组轮转的位置：");

        int m = scanner.nextInt();

        // 此处完成代码

        printArray(numbers);

        scanner.close();
    }

    /**
     最长公共前缀
     */
    public static void maxCommonPrefix() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("输入第1个字符串：");
        String s1 = scanner.nextLine();
        System.out.print("输入第2个字符串：");
        String s2 = scanner.nextLine();

        // 此处完成代码

        scanner.close();
    }

    /**
     合并两个有序数组
     */
    public static void mergeArray() {
        int[] array1 = randomInitIntArray(10, 0, 10);
        int[] array2 = randomInitIntArray(20, 0, 10);

        bubbleSort(array1);
        bubbleSort(array2);

        System.out.print("排序后的array1：");
        printArray(array1);
        System.out.print("排序后的array2：");
        printArray(array2);

        int[] array = new int[array1.length + array2.length];

        // 此处完成代码

        printArray(array);
    }

    /**
     二维数组对角线元素求和
     */
    public static void sumDiagonal() {
        int[][] matrix = randomInitIntMatrix(10, 10, 0, 10);

        int sum = 0;

        // 此处完成代码

        System.out.println("矩阵对角线之和为：" + sum);
    }

    /**
     矩阵转置（二维数组行列互换）
     */
    public static void transposition() {
        int[][] matrix1 = randomInitIntMatrix(3, 4, 0, 10);
        int[][] matrix2 = randomInitIntMatrix(4, 3, 0, 1);

        // 此处完成代码

        System.out.println("转置后的矩阵：");
        printMatrix(matrix2);
    }

    public static void main(String[] args) {
//        leapYear();
//        grade();
//        convCF();
//        multiplicationTable();
//        sum1ToN();
//        divisibleBy3();
//        narcissisticNumber();
//        primeNumber();
//        numberGuess();
//        fibonacciFor();
//        fibonacci();
//        factorialFor();
//        factorial();
//        stringStatistic();
//        palindrome();
//        reverseArray();
//        move0ToEnd();
//        rotateArray();
//        maxCommonPrefix();
//        mergeArray();
//        sumDiagonal();
//        transposition();
    }

    /**
     * 随机生成 int 数组
     * @param length: int (数组长度)
     * @param floor: int (数组中元素值的下限)
     * @param ceiling: int (数组中元素值的上限)
     * @return : int[] (初始化完成的数组)
     */
    public static int[] randomInitIntArray(int length, int floor, int ceiling) {
        Random random = new Random();
        int[] array = new int[length];

        for (int i = 0; i < length; i++) {
            array[i] = random.nextInt(ceiling - floor) + floor;
        }

        System.out.print("随机int数组：");
        printArray(array);

        return array;
    }

    /**
     * 随机生成2维 int 数组
     * @param m: int (2维数组的行数)
     * @param n: int (2维数组的列数)
     * @param floor: int (数组中元素值的下限)
     * @param ceiling: int (数组中元素值的上限)
     * @return : int[][] (初始化完成的2维数组)
     */
    public static int[][] randomInitIntMatrix(int m, int n, int floor, int ceiling) {
        Random random = new Random();
        int[][] matrix = new int[m][n];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                matrix[i][j] = random.nextInt(ceiling - floor) + floor;
            }
        }

        System.out.println("随机2维int数组：");
        printMatrix(matrix);

        return matrix;
    }

    /**
     * 打印 int 数组
     * @param array: int[] (要打印的int数组)
     */
    public static void printArray(int[] array) {
        for (int e : array) {
            System.out.print(e + " ");
        }
        System.out.println();
    }

    /**
     * 打印2维 int 数组
     * @param matrix: int[][] (要打印的2维int数组)
     */
    public static void printMatrix(int[][] matrix) {
        for (int[] array : matrix) {
            printArray(array);
        }
    }


    /**
     * 冒泡排序
     * @param array: int[] (要排序的int数组)
     */
    public static void bubbleSort(int[] array) {
        int n = array.length;
        boolean swapped;
        for (int i = 0; i < n - 1; i++) {
            swapped = false;
            for (int j = 0; j < n - i - 1; j++) {
                if (array[j] > array[j + 1]) {
                    // 交换 array[j+1] 和 array[j]
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    swapped = true;
                }
            }
            // 如果没有元素交换，说明数组已经排序好
            if (!swapped) break;
        }
    }
}